package com.nsl.my_youlai.mystar;

import java.io.File;

public class NslUtilFilePath {
    /**
     * 获得工程根目录，如 D:\my_hello_project
     * @return
     */
    static public   String getProjectAbsPath(){
        return System.getProperty("user.dir");
    }


    /**
     * 根据文件路径，加入uuid标识
     * 如: d:\abc\demo1.xlsx =>  d:\abc\demo1_uuid.xlsx
     * @param filePath
     * @param idToken
     * @return
     */
    static public String buildFilePathWithIdTokenAtRear(String filePath,String idToken){

        if(filePath.endsWith("/") || filePath.endsWith(File.separator)){
            throw  new RuntimeException("传入的filePath 不合法");
        }
        String filePathWithoutExtension=getFilePathWithoutExtension(filePath);
        String filePathExtension=getFileExtension(filePath);
        return filePathWithoutExtension+"_"+idToken+"."+filePathExtension;
    }

    /**
     * 根据文件路径，加入uuid标识
     * 如: d:\abc\demo1.xlsx =>  d:\abc\demo1_uuid.xlsx
     * @param filePath
     * @return
     */
    static public String buildFilePathWithUuidAtRear(String filePath){
        String uuid=NslUtilUuid.generateUuidWithOutHyphen();
        return buildFilePathWithIdTokenAtRear(filePath,uuid);
    }

    /**
     * 根据文件路径，加入 System time 标识
     * 如: d:\abc\demo1.xlsx =>  d:\abc\demo1_11234354.xlsx
     * @param filePath
     * @return
     */
    static public String buildFilePathWithSystemTimestampAtRear(String filePath){

        return buildFilePathWithIdTokenAtRear(filePath,System.currentTimeMillis()+"");
    }

    static public String getClassPath(){
        // classPath ：/D:/Java_Projects/ideaIU-2022.2.3.win_projects/my-youlai/target/test-classes/
        String classPath=ClassLoader.getSystemResource(".").getPath();
        classPath=classPath.substring(1);
        if(File.separator.equalsIgnoreCase("\\")){
            // classPath D:\\Java_Projects\\ideaIU-2022.2.3.win_projects\\my-youlai\\target\\test-classes\\
            // /在字符串中是转义符
            classPath=classPath.replaceAll("/","\\\\");
        }else{
            classPath=classPath.replaceAll("/",File.separator);
        }
        return classPath;
    }

    /**
     * 根据文件路径返回文件名称
     * 可以根据以下几种，
     * f:\\aFolder\\1.xls
     * bFolder\\1.xls
     * 1.xls
     * 1
     * 都返回一致结果为：1.xls,最后一个返回1
     * @param filePath
     * @return
     */
    static public String getFileName(String filePath){
       return NslUtilString.getLastFragment(filePath,"\\");
    }

    /**
     * 根据文件路径返回文件名称,文件名不包含扩展名
     * 可以根据以下几种，
     * f:\\aFolder\\1.xls
     * bFolder\\1.xls
     * 1.xls
     * 1
     * 都返回一致结果为：1
     * @param filePath
     * @return
     */
    static public String getFileNameWithoutExtension(String filePath){
        String fileName= NslUtilString.getLastFragment(filePath,"\\");
        int index=fileName.lastIndexOf(".");
        if(index==-1){
            return fileName;
        }else{
            return fileName.substring(0,index);
        }
    }

    /**
     * 根据文件路径返回文件路径名称,文件路径名不包含扩展名
     * 可以根据以下几种，
     * f:\\aFolder\\1.xls
     * 返回结果为：f:\\aFolder\\1
     * @param filePath
     * @return
     */
    static public String getFilePathWithoutExtension(String filePath){
        if(filePath.endsWith("/") || filePath.endsWith(File.separator)){
            throw  new RuntimeException("传入的filePath 不合法，可能为文件夹");
        }
        if(filePath.lastIndexOf(".")==-1){
            throw  new RuntimeException("传入的filePath 不包含扩展名");
        }
        return filePath.substring(0,filePath.lastIndexOf("."));
    }

    /**
     * 根据相对classpath的路径返回，绝对路径
     * 可以根据以下几种，
     * abc\def
     * abc\def\
     * abc/def
     * /abc/def/
     * 都返回一致结果为：D:\Java_Projects\ideaIU-2022.2.3.win_projects\my-youlai\target\classes\abc\def
     * @param relativePath
     * @return
     */
    static public String getFilePathBasedOnClassPath(String relativePath){
        // /abc=>abc
        if(relativePath.startsWith("/")){
            relativePath=relativePath.substring(1);
        }

        // \\abc=>abc
        if(relativePath.startsWith("\\\\")){
            relativePath=relativePath.substring(2);
        }

        // abc/efg => abc\\efg
        if(File.separator.equalsIgnoreCase("\\")){
            relativePath=relativePath.replaceAll("/","\\\\");
        }

        if(relativePath.endsWith("\\")){
            relativePath=relativePath.substring(0,relativePath.length()-1);
        }

        if(File.separator.equalsIgnoreCase("\\")){
            return getClassPath()+relativePath;
        }else{
            return getClassPath()+File.separator+relativePath;
        }
    }

    /**
     * 返回 文件的扩展名，如 d:\abc\1.xlsx，返回 xlsx
     * 有个缺陷，如果 传入的为目录 d:\ab.c 的话，返回的是c
     * @param filePath
     * @return
     */
    static public String getFileExtension(String filePath){
        if(filePath.endsWith("/") || filePath.endsWith(File.separator)){
            throw  new RuntimeException("传入的filePath 不合法，可能为文件夹");
        }
        if(filePath.lastIndexOf(".")==-1){
            throw  new RuntimeException("传入的filePath 不包含扩展名");
        }

        return filePath.substring(filePath.lastIndexOf(".")+1,filePath.length());
    }

    /**
     * 将 d:\abc\1.xlsx 根据传入的 {"x1","y2"} 生成文件路径为 d:\abc\1_x1_y2.xlsx
     * @param filePath filePath是文件路径，且有以.分割结束的扩展名
     * @param suffixes {"x1","y2"}
     * @param fileSeparator 分隔符，如 "_"
     * @return
     */
    static public String buildFilePathWithSuffixes(String filePath,String[] suffixes,String fileSeparator){
        if(filePath.endsWith("/") || filePath.endsWith(File.separator)){
            throw  new RuntimeException("传入的filePath 不合法，可能为文件夹");
        }
        if(filePath.lastIndexOf(".")==-1){
            throw  new RuntimeException("传入的filePath 不包含扩展名");
        }
        String filePathWithoutExtension=getFilePathWithoutExtension(filePath);
        String fileExtension=getFileExtension(filePath);
        for (String suffix : suffixes) {
            filePathWithoutExtension+=fileSeparator+suffix;
        }
//        filePathWithoutExtension=filePathWithoutExtension.substring(0,filePathWithoutExtension.length()-1);
        return filePathWithoutExtension+"."+fileExtension;
    }

    /**
     * 将 d:\abc\1.xlsx 根据传入的 {"x1","y2"} 生成文件路径为 d:\abc\1_x1_y2.xlsx
     * @param filePath filePath是文件路径，且有以.分割结束的扩展名
     * @param suffixes {"x1","y2"}
     * @return
     */
    static public String buildFilePathWithSuffixes(String filePath,String[] suffixes){
        return buildFilePathWithSuffixes(filePath,suffixes,"_");
    }


    public static void main(String[] args) {
        System.out.println(getClassPath());

        String relativePath="abc\\def";
        System.out.println(getFilePathBasedOnClassPath(relativePath));
        relativePath="abc\\def\\";
        System.out.println(getFilePathBasedOnClassPath(relativePath));
        relativePath="abc/def";
        System.out.println(getFilePathBasedOnClassPath(relativePath));
        relativePath="/abc/def";
        System.out.println(getFilePathBasedOnClassPath(relativePath));
        relativePath="/abc/def/";
        System.out.println(getFilePathBasedOnClassPath(relativePath));

        String fileString1="d:\\fold1\\abc.xlsx";
        String uuid=NslUtilUuid.generateUuidWithOutHyphen();

        System.out.println(getFileExtension(fileString1));
        System.out.println(fileString1.lastIndexOf("."));

        System.out.println(fileString1+ " => "+buildFilePathWithIdTokenAtRear(fileString1, uuid));

        String[] suffixes={"x1","x2"};

        System.out.println(buildFilePathWithSuffixes(fileString1, suffixes));


    }
}
